#include <iostream>

// 函数的调用（本质上就是指针跳转）：CPU执行程序的时候，遇到函数时，首先把当前位置记录下来，然后CPU进行跳转，根据指针所指方向跳转到func函数的代码段位置继续执行，当执行完毕再进行跳转返回，顺带将整个函数的返回值进行返回，然后赋值继续执行，对于CPU来讲其实这些动作都是多余的

// 内联函数在编译期时会在函数调用的地方进行代码替换（有点像宏函数）
// 内：编译器内部   联：连接代码
// 目的：提高程序执行的效率（这样就省去了函数跳转的过程）
// 宏函数：#define Func(x, y, z) (x) * (y) + (z) 但宏函数有个缺陷就是它是单纯的文本替换，要注意加括号的问题
// 作用比较：define在预处理阶段进行文本替换，而inline是在编译期进行代码替换，到了运行期的时候它们都是代码段，所以从性能的角度来看没有区别
// 提倡用内联函数替换宏函数

// 注意事项：
// 1、定义在类内或结构体内的函数会自动变为内联函数（这是因为定义在结构体内部的函数不会太长）
// 2、内联的规则：（内联函数不是百分百生效，内联关键字更像是你给编译器提供的一种建议，但是最后有没有实现内联由编译器决定）
//  (1)不能有循环（for while）、递归
//  (2)不能存在多个判断分支
//  (3)函数体不能太长
//  (4)不存在任何对内联函数的取地址操作（不能用到函数指针，因为内联在编译结束之后就不存在这个函数了，就没有办法取这个函数的地址）
inline int func(int a, int b, int c)
{
    return a * b + c;
}

int main()
{
    // int a = func(1, 2, 3);
    std::cout<<func(1+2, 3+4, 5+6)<<std::endl;  //编译器会自动在函数调用的地方把它变成(1+2)*(3+4)+(5+6)，就省去了跳转到函数内部的过程
    return 0;
}